package test.n00200;


import java.util.Arrays;

public class Problem00270 {
    public static void main(String[] args) {
        //println(new int[]{1, 2, 3, 4, 5, 1, 2, 3});
        //println(new int[]{3, 2, 2, 3}, 3);
        //println(new int[]{0, 1, 2, 2, 3, 0, 4, 2}, 2);
        println(new int[]{4, 4, 0, 1, 0, 2}, 0);
    }

    public static void println(int[] nums, int val) {
        Solution ss = new Solution();
        System.out.println(Arrays.asList(nums) + "," + val + "," + ss.removeElement(nums, val));
    }

    private static class Solution {

        /**
         * 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
         * <p>
         * 不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
         * <p>
         * 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
         * <p>
         * 来源：力扣（LeetCode）
         * 链接：https://leetcode.cn/problems/remove-element
         * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
         *
         * 解题思路:
         * 直接删除
         *
         * @param nums
         * @param val
         * @return
         */
        public int removeElement(int[] nums, int val) {
            int len = nums.length;
            int pos = 0;

            int n = 0;
            while (pos < len - n) {
                if (nums[pos] == val) {
                    n++;
                    // 往前移动 第n个节点，开始都往前移动1位
                    int i = pos;
                    while (i < len - n) {
                        if (i + 1 >= len) {
                            nums[i] = 0;
                        } else {
                            nums[i] = nums[i + 1];
                        }
                        i++;
                    }
                }
                pos++;
            }
            return len - n;
        }
    }
}
